/*
TS 语法对于方法而言，完成功能性的限制
    -1、限制方法形参的数量、类型、默认值
    -2、限制方法体中的返回行为
    -3、限制方法执行结果的 接受数据的变量类型
*/
function showC(arg1: string, arg2: number) {
    // TS 对于方法定义的形参的校验：形参一旦定义必须被使用
    // TS 对于形参的类型限制：
    //      a、在严格语法模式下，必须为形参提供类型描述
    //         例如 function show(形参变量：数据类型)
    //      b、在非严格语法模式下，形参不定义类型，默认被描述为 any
    console.log(arg1, arg2);
}

// 方法形参的定义，就是对方法调用时 实参数量的描述
// 方法形参的数据类型描述，就是对方法调用时 实参类型的限定
// showC("字符串");
showC("aaa", 123);

/*
        TS 方法的可选形参定义
        在构成方法形参时 以 ？ 关键字描述该形参 可传可不传
        例如  function show(arg1?:string)
        ?关键字是一个 依赖形参定义关系
        ?关键字的修饰，必须以连续方式出现于形参中
        被定义了?的形参，后面的形参必须也定义为 可选参数
    TS 方法形参的默认值定义
        TS形参默认的定义规则，完全遵循ES6的默认值定义规则
        例如 function show(arg1:string=默认值)
        默认值定义自带可选参数特性

*/
function showD(arg1:string,str?:string){
    if(str){
        console.log(arg1+str);
    }else{
        console.log(arg1+"默认字符串")
    }
}
showD("第一个参数-");
showD("第一个参数-","end");

//  showE( arg1 [ ,arg2 [ ,arg3 ] ] )
function showE(arg1:number,arg2?:string,arg3?:boolean){

}
showE(123);
showE(123,"aaa");
showE(123,"aaa",true);
// showE(123,boolean);

function showF(arg1:string,arg2?:number,arg3:boolean=false){
    // JS早期语法中 未定义void 0 或者void(0)
}

// JS和TS的默认值功能方法
function showG(arg1:any="默认值"){
    console.log(arg1)
}
function showH(arg1:any){
    arg1 = arg1 || "默认值";
}


// get(url, [data], [callback], [type])
/*
    url 必传
    data 可选
    callback 可选  Function
    type 可选
    可选参数无序
*/
function get(url:string, data?:any, callback?:any, type?:any){
    if(typeof data === "function"){
        type = callback;
        callback = data;
        data = undefined;
    }
    console.log("url:",url);
    console.log("data:",data);
    console.log("callback:",callback);
    console.log("type:",type);
}
get("地址","参数",function(){},"json");
get("地址",function(){});
get("地址",function(){},"text");


// 方法返回值的限定
/*
    TS 对方法定义时，可以描述当前方法是否存在返回值，描述返回值的类型
    a、如果方法没有返回结果进行限定，当前方法的方法返回结果为return 结果类型和数据
    b、通过为方法声明后 添加：变量类型 ，限定当前方法是否允许返回结果已经返回数据类型
*/

function showJ() {
    return "z字符串";
}

var resultA:string = showJ();
console.log(resultA);

/*
    TS 扩展 void 类型，表示当前方法没有返回值
            限定的是方法体中 return 定义
*/
function showK():void{
    console.log(1);
    return;
    console.log(2);
}

var resultB = showK();

// 当方法返回值的类型不为 void时，要求方法必须存在结果
function showL():string {
    return "字符串";
}
function showM():string {
    // 如果存在抛出错误，也表示方法存在结果
    throw new Error("错误");
}

// 被要求存在返回结果的方法，方法体中每个分支都必须存在结果
function showN(params:boolean):string {
    if(params){
        return "真";
    }else{
        return "假";
    }
}
function showO (params:string):string{
    try {
        return JSON.parse(params);
    } catch (error){
        throw error;
    }
}











